﻿
#include <iostream>
#include <functional>
#include <thread>
#include <future>
#include <chrono>
using namespace std;

#include "threadpool.h"

#if 1
int sum1(int a, int b)
{
    this_thread::sleep_for(chrono::seconds(2));
    // 比较耗时
    return a + b;
}
int sum2(int a, int b, int c)
{
    this_thread::sleep_for(chrono::seconds(2));
    return a + b + c;
}
// io线程 
void io_thread(int listenfd)
{

}
// worker线程
void worker_thread(int clientfd)
{

}
int main()
{
    ThreadPool pool;
    pool.setMode(PoolMode::MODE_CACHED);
    pool.start(2);

    future<int> r1 = pool.submitTask(sum1, 1, 2);
    future<int> r2 = pool.submitTask(sum2, 1, 2, 3);
    future<int> r3 = pool.submitTask([](int b, int e)->int {
        int sum = 0;
        for (int i = b; i <= e; i++)
            sum += i;
        return sum;
        }, 1, 100);
    future<int> r4 = pool.submitTask([](int b, int e)->int {
        int sum = 0;
        for (int i = b; i <= e; i++)
            sum += i;
        return sum;
        }, 1, 100);
    future<int> r5 = pool.submitTask([](int b, int e)->int {
        int sum = 0;
        for (int i = b; i <= e; i++)
            sum += i;
        return sum;
        }, 1, 100);
    //future<int> r4 = pool.submitTask(sum1, 1, 2);

    cout << r1.get() << endl;
    cout << r2.get() << endl;
    cout << r3.get() << endl;
    cout << r4.get() << endl;
    cout << r5.get() << endl;
    getchar();
}
#endif


// 需求分析
#if 0
/*
如何能让线程池提交任务更加方便，把函数sum当做任务处理，参数是：函数+不固定参数的个数
1. pool.submitTask(sum1, 10, 20);
   pool.submitTask(sum2, 1 ,2, 3);
   submitTask:可变参模板编程

2. 我们自己造了一个Result以及相关的类型，代码挺多
    C++11 线程库   thread   packaged_task(function函数对象):方便获取任务的返回值   async：直接获取返回值
   使用future来代替Result节省线程池代码
*/

int sum1(int a, int b)
{
    // 比较耗时
    return a + b;
}
int sum2(int a, int b, int c)
{
    return a + b + c;
}

int main()
{
#if 1
    // 包装一下任务，也就是设置一个函数对象类型，类似模板匹配，通过包装的任务，调用相应的函数
    // packaged_task和function的不同：packaged_task支持get_future方法，可以拿到任务的返回值；
    packaged_task<int(int, int)> task(sum1);
    // future <=> Result
    future<int> res = task.get_future();
    // task(10, 20);  
    // 也可把task放到独立的线程池中来做
    thread t(std::move(task), 10, 20);
    t.detach();
    // sum1如果比较耗时，这里会阻塞，直到任务处理完成；
    cout << res.get() << endl;
    getchar();
#endif

#if 0
    // 把函数直接当成线程函数，直接传递函数，一个函数就代表一个任务啦
    thread t1(sum1, 10, 20); 
    thread t2(sum2, 1, 2, 3);

    t1.join();
    t2.join();
#endif
}
#endif